/* 
  接口是一系列抽象方法的声明，是一些方法特征的集合，
  这些方法都应该是抽象的，需要由具体的类去实现，
  然后第三方就可以通过这组抽象方法调用，让具体的类执行具体的方法。
*/

interface MyPerson {
  firstName: string
  lastName: string
  // 接口里的方法不能有方法体  所有方法是抽象方法
  // sayHi: () => string 可以改为下面sayHi
  sayHi(): string
}

const customer: MyPerson = {
  firstName: 'tom',
  lastName: 'helle',
  // sayHi: (): string => { return 'hi Jack' } 下面为简写
  sayHi: (): string => 'hi Jack'
}

console.log('customer对象')
console.log(customer.firstName)
console.log(customer.lastName)
console.log(customer.sayHi())
console.log('----------------------')

// 联合类型和接口
interface MySkill {
  hobby: string
  // fn 类型可以是字符串数组，字符串，返回值为字符串的方法
  fn: string[] | string | (() => string)
}

let option1: MySkill = {
  hobby: '打篮球',
  fn: '打篮球很牛'
}
let option2: MySkill = {
  hobby: '踢足球',
  fn: ['很牛', '受欢迎']
}
let option3: MySkill = {
  hobby: '学习ts',
  fn: () => 'helle ts'
}

console.log(option1.fn)
console.log(option2.fn)

let A: any = option3.fn
console.log(A())

interface Mytest {
  name: string
  age?: number // 可选
}

let test1: Mytest = {
  name: 'zhansan'
}

// 接口继承
interface A {
  x: number
  y: number
}

// 接口B继承了A中的x,y 那么接口B同时拥有了x,y,z
interface B extends A {
  z: string
}

let haha: B = {
  x: 1,
  y: 2,
  z: '哈哈哈哈,B继承了A'
}

// 多继承
interface C extends A, B {
  desc: string
}

let hehe: C = {
  x: 1,
  y: 2,
  z: '哈哈哈哈,B继承了A',
  desc: 'C实现了多继承'
}
